/**
 * Implementacion de un fromulario abstracto que predefine eventos que la mayor�a de formularios deben cumplir.<br> Funciona
 * como una Interfaz para ser encapsulado por un Extmx.WindowForm, quien controla los eventos definidos por este formulario
 * @class Extmx.FormWizard
 * Ventana preconfigurada para encapsular un formulario, con botones de aceptar y cancelar, barra de estado para mostrar mensajes
 *
 * @extends Extmx.FormPanel
 * @autor Ing. Josue Hernandez Gomez<br>
 *        joshua@extjs.mx<br>
 *        http://www.joshua.com.mx
 * @fecha 8 de febrero de 2011. M&eacute;xico DF
 *
 */
Ext.ns("Extmx.FormWizard");
Extmx.FormWizard=Ext.extend(Extmx.FormPanel,{

    /**
     * @cfg {String} layout Por defecto en card.
     */
    layout:"card",
	
	activeItem: 0,

    initComponent: function (){

        Ext.apply(this,{
            items: this.getCards()
        });

        Extmx.FormWizard.superclass.initComponent.apply(this,arguments);

        this.addEvents(
            /**
		 * @event noanterior
		 * Enlazado con el evento "invalid" de cada componente que encapsula. Cada campo debe de tener el listener "invalid" de la
		 * siguiente manera:
		 * <pre><code>
			items: {
					fieldLabel: '* Login',
					name: 'txtLoginU',
					allowBlank:false,
					vtype:'nombre',
					listeners:{
						scope:this,
						invalid : this.markInvalids
					}
				}
		 * </code></pre>
		 * Ejecut&aacute;ndose inmediatamente el m&eacute;todo markInvalids y el evento "invalid"
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "noanterior",

            /**
		 * @event nosiguiente
		 * Similar al evento {@link #agregado}. Se dispara despu&eacute;s de haber cargado datos del servidor a este formulario
		 * @param {Extmx.FormWizard} form Este formulario
		 */
            "nosiguiente",

            /**
		 * @event noflechas
		 * Disparado despues de realizar la persistencia o guardado de la informaci&oacute;n capturada iniciado por le m&eacute;todo {@link #submit}
		 * @param {Extmx.FormWizard} form Este formulario
		 */
            "noflechas",

            /**
		 * @event sianterior
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo.
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "sianterior",
        /**
		 * @event sisiguiente
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo.
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "sisiguiente",
        /**
		 * @event siflechas
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo.
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "siflechas",
		/**
		 * @event siguardar
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo.
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "siguardar",
		/**
		 * @event noguardar
		 * Se dispara al considerarse alg&uacute;n estado inv&aacute;lido dentro del formuario. Puede lanzarse
		 * manualmente al realizar una validaci&oacute;n remota por ejemplo.
		 * @param {Extmx.FormWizard} form Este formulario
		 * @param {String} msg Mensaje de error lanzado
		 */
            "noguardar",


          /**
		 * @event error
		 * Al dispararse, le dira a la ventana que oculte sus botones
		 * @param {Extmx.FormWizard} form Este formulario
		 */
            "ocultarbotones"
        );
    },

    getCards: Ext.emptyFn,

    mostrarAnterior: function (){
        if(this.activeItem != 0){
			this.layout.setActiveItem(--this.activeItem);
			this.fireEvent('sisiguiente', this);
			this.fireEvent('noguardar', this);
		}
		if((this.activeItem) == 0){
			this.fireEvent('noanterior', this);
		}
    },

    mostrarSiguiente: function (){
		if(this.activeItem < this.items.length){
			this.layout.setActiveItem(++this.activeItem);
			this.fireEvent('sianterior', this);
		}
		if((this.activeItem+1) == this.items.length){
			this.fireEvent('nosiguiente', this);
			this.fireEvent('siguardar', this);
		}
    }
});